package org.study.plus.boot.service;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.util.Assert;
import org.study.plus.boot.mapper.SortDataMapper;
import org.study.plus.boot.model.SortData;
import org.study.plus.boot.vo.SortDataDTO;

/**
 * 参考 https://llg-notes.blog.csdn.net/article/details/136687088
 *
 * @author doveylovey
 * @version v1.0.0
 * @email 1135782208@qq.com
 * @date 2024年04月19日
 */
@Slf4j
@RequiredArgsConstructor
@Service
public class SortDataServiceImpl extends ServiceImpl<SortDataMapper, SortData> implements SortDataService {
    private final SortDataMapper sortDataMapper;

    @Override
    public int updateSort(SortDataDTO dto) {
        // 被移动的产品
        SortData targetSortData = sortDataMapper.selectById(dto.getProductId());
        Assert.notNull(targetSortData, "");
        // 用于更新的产品对象
        SortData updateSortData = new SortData();
        updateSortData.setId(targetSortData.getId());
        // 其他属性略，可直接BeanUtils.copyProperties()
        // afterProductId为空，代表置顶操作
        // 非置顶
        if (dto.getAfterProductId() != null) {
            // 移动目标点的产品ID
            SortData afterSortData = sortDataMapper.selectById(dto.getAfterProductId());
            Assert.notNull(afterSortData, "");
            // 前移
            if (afterSortData.getHotSort() < targetSortData.getHotSort() && targetSortData.getHotSort() - afterSortData.getHotSort() > 1) {
                // 产品前移，受影响的产品要后移
                sortDataMapper.moveBack(afterSortData.getHotSort(), targetSortData.getHotSort());
                // 被移动的产品放到目标位置的产品之后
                updateSortData.setHotSort(afterSortData.getHotSort() + 1);
                return sortDataMapper.updateById(updateSortData);
                // 后移
            } else if (afterSortData.getHotSort() > targetSortData.getHotSort() && afterSortData.getHotSort() - targetSortData.getHotSort() > 1) {
                // 产品后移，受影响的产品要前移
                sortDataMapper.moveBefore(afterSortData.getHotSort(), targetSortData.getHotSort());
                // 被移动的产品放到目标位置的产品之后，但此时目标位置的产品已经前进一步，这里不再需要+1
                updateSortData.setHotSort(afterSortData.getHotSort());
                return sortDataMapper.updateById(updateSortData);
            }
        } else {
            // 置顶
            // 处理因置顶产品而受影响的其他产品的sort值
            sortDataMapper.moveTop(targetSortData.getHotSort());
            // 赋0，置顶
            updateSortData.setHotSort(0);
            return sortDataMapper.updateById(updateSortData);
        }
        // 如果两个Id都一样，也不用处理，直接返回个操作成功也无所谓
        return 1;
    }
}
